% SoundSynthesis.m

function res = SoundSynthesis(musicScore, bpm)
% SoundSynthesis 将SingleSound得到的许多单音按一定的重叠比率整合为一条音频
%   musicScore: 乐谱参数，默认F调，以下方的fre_f为准。
%               size: [n 3] n行，1,2列分别为小字几组和对应唱名，3行为所占拍数
%               （后期可扩展，实现每个音单独设置其相应参数）（ps：什么UTAU）
%   OverlapRate: 重叠率，后一个音与前一个音的衰减部分比率
%   bpm: 每分钟拍数，衡量音乐速率
% res: 返回以正弦波为基础的幅值发生衰减的采样后的离散值
%      大小[:,1]

    dur = 60 / bpm;     % 每拍所占时长（单位：秒）
    load("ConstantDefinition.mat", "FRE_F", "TurnPoint3", "SampRate", "OverlapRate");
    offset = 0;         % 重叠时向前偏移值
    offset_t = 0;       % 重叠时间（单位：秒）
    i = 1;              % 循环变量
    res = 0;
    for index = musicScore'
        sou = SingleSound(FRE_F(index(1),index(2)), SampRate, 10, ...
                index(3) * dur + offset_t);
        i = i - offset;
        j = 1;
        while i <= size(res,1) && i > 1
            res(i, 1) = res(i) + sou(j);
            j = j + 1;
            i = i + 1;
        end
        while j <= size(sou,1)
            res(i, 1) = sou(j);
            j = j + 1;
            i = i + 1;
        end
        offset = ceil(OverlapRate * (1 - TurnPoint3) * size(sou, 1));
        offset_t = OverlapRate * (1 - TurnPoint3) * (index(3) * dur + offset_t);
    end
    res(i, 1) = 0;
end

